const express = require('express');
const path = require('path');
const bodyParser = require('body-parser');

const date_tool = require('./util/date_tool');
const checkJWTMiddleWare = require('./middleWare/checkJWTMiddleWare')

let app = express();

// 路由管理
const login_router = require('./routes/login');
const user_router = require('./routes/user');
const sys_router = require('./routes/sys');
const checkin_router = require('./routes/checkin');
const community_router = require('./routes/community');
const hire_router = require('./routes/hire');
const storage_router = require('./routes/storage');
const check_router = require('./routes/check');
const print_router = require('./routes/print');

let reqId = 1;

// 输出所有请求的日志
app.use(function (req, res, next) {
    req.reqId = reqId++;
    // 记录请求到达服务端的时间戳
    req.time = new Date();
    req.formatTime = date_tool.formatDate(req.time);
    req.formatDate = req.formatTime.split(' ')[0];
    // 输出请求的日志 - 如果使用了反向代理 此处的地址可能不是客户端的 需要修改
    console.log(`[log] [req-id=${req.reqId}] ${req.connection.remoteAddress} | ${req.formatTime} | ${req.method} ${req.originalUrl} | `);
    next();
});

// 设置允许跨域请求
app.use(function (req, res, next) {
    // 添加允许跨域的请求头
    // 设置允许跨域的源为所有源
    res.setHeader('Access-Control-Allow-Origin', '*');
    // 设置允许的HTTP方法为所有方法
    res.setHeader('Access-Control-Allow-Methods', '*');
    // 设置允许的请求头为所有头
    res.setHeader('Access-Control-Allow-Headers', '*');
    // 解决预检请求
    if (req.method === 'OPTIONS') {
        res.sendStatus(200);
        return;
    }
    // 进行下一个路由的调用
    next();
});

// 设置http请求报文的长度限制为 15M
app.use(bodyParser.json({limit: '15mb'}));
app.use(bodyParser.urlencoded({limit: '15mb', extended: true}));

// 服务端解析json数据的中间件
app.use(express.json());
// 服务端解析GET请求参数的中间件
app.use(express.urlencoded({ extended: false }));
// 服务端解析cookie的中间件（暂时不使用）
// app.use(cookieParser());

// 挂载静态资源
app.use(express.static(path.join(__dirname, 'public')));

// 动态路由
app.use('/login', login_router);          // 登录模块
app.use(checkJWTMiddleWare)               // 验证登录中间件
app.use('/user', user_router);            // 用户模块
app.use('/sys', sys_router);              // 系统模块
app.use('/checkin', checkin_router);      // 打卡模块
app.use('/community', community_router);  // 社区模块
app.use('/hire', hire_router);            // 招聘模块
app.use('/storage', storage_router);      // 存储模块
app.use('/check', check_router);          // 微信官方 - 验证敏感信息模块
app.use('/print', print_router);          // 打印服务模块

// 处理 404 错误
app.use(function (req, res, next) {
    res.status(404);
    res.statusMessage = '404 not found';
    res.sendFile(path.join(__dirname, '/views/error.html'))
});

// app对象暴露
module.exports = app;
